home *** CD-ROM | disk | FTP | other *** search
/ Aminet 25 / Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso / Aminet / game / shoot / ADoom_src_1_2.lha / ADoom_src / amiga_things.s < prev    next >
Text File  |  1998-03-01  |  19KB  |  882 lines

  1.         mc68020
  2.  
  3.         xdef    @R_AddSprites
  4.         xdef    _R_AddSprites
  5.  
  6.         xdef    @R_DrawMasked
  7.         xdef    _R_DrawMasked
  8.  
  9.         xdef    @R_DrawSprite
  10.         xdef    _R_DrawSprite
  11.  
  12.         xdef    @R_DrawVisSprite
  13.         xdef    _R_DrawVisSprite
  14.  
  15.         xdef    @R_SortVisSprites
  16.         xdef    _R_SortVisSprites
  17.         xdef    @R_NewVisSprite
  18.         xdef    _R_NewVisSprite
  19.         xdef    @R_ClearSprites
  20.         xdef    _R_ClearSprites
  21.  
  22.         section    text,code
  23.  
  24.         near    a4,-2
  25.  
  26. ;-----------------------------------------------------------------------
  27.  
  28.         include    "exec/types.i"
  29.  
  30. ;-----------------------------------------------------------------------
  31. ; R_AddSprites (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
  32.  
  33.         xref    _extralight
  34.         xref    _scalelight
  35.         xref    _spritelights
  36.         xref    @R_ProjectSprite
  37.         xref    _validcount
  38.  
  39.         STRUCTURE    sector,0
  40.  
  41.          LONG    st_floorheight
  42.          LONG    st_ceilingheight
  43.          WORD    st_floorpic
  44.          WORD    st_ceilingpic
  45.          WORD    st_lightlevel
  46.          WORD    st_special
  47.          WORD    st_tag
  48.          LONG    st_soundtraversed
  49.          APTR    st_soundtarget
  50.          STRUCT    st_blockbox,4*4
  51.          STRUCT    st_shit,24
  52.          LONG    st_validcount
  53.          APTR    st_thinglist
  54.          ;etc. etc.
  55.  
  56. snext        EQU    24
  57.  
  58. @R_AddSprites:
  59. _R_AddSprites:
  60.         move.l    _validcount(a4),d0
  61.         cmp.l    st_validcount(a0),d0
  62.         beq.b    .ra_Exit
  63.  
  64.         move.l    d2,-(sp)
  65.         move.l    d0,st_validcount(a0)
  66.  
  67.         moveq    #0,d0
  68.         move.w    st_lightlevel(a0),d0
  69.         lsr.l    #4,d0
  70.         move.l    #_scalelight,_spritelights(a4)
  71.         add.l    _extralight(a4),d0
  72.         bmi.b    .ra_LightDone
  73.         cmp.l    #16,d0
  74.         bmi.b    .ra_LightOK
  75.         add.l    #2880,_spritelights(a4)
  76.         bra.b    .ra_LightDone
  77. .ra_LightOK:
  78.         move.l    d0,d2
  79.         lsl.l    #7,d0
  80.         lsl.l    #6,d2
  81.         add.l    d0,d2
  82.         add.l    d2,_spritelights(a4)
  83. .ra_LightDone:
  84.  
  85.         move.l    st_thinglist(a0),d2
  86.         beq.b    .ra_AllDone
  87. .ra_Loop:
  88.         move.l    d2,a0
  89.         move.l    snext(a0),d2
  90.         beq.b    .ral_Done
  91.         jsr    (@R_ProjectSprite)
  92.         bra.b    .ra_Loop
  93. .ral_Done:
  94.         jsr    (@R_ProjectSprite)
  95. .ra_AllDone:
  96.         move.l    (sp)+,d2
  97. .ra_Exit:
  98.         rts
  99.  
  100.  
  101. ;void R_AddSprites (sector_t* sec)
  102. ;{
  103. ;    mobj_t*        thing;
  104. ;    int            lightnum;
  105. ;
  106. ;    // BSP is traversed by subsector.
  107. ;    // A sector might have been split into several
  108. ;    //  subsectors during BSP building.
  109. ;    // Thus we check whether its already added.
  110. ;    if (sec->validcount == validcount)
  111. ;    return;        
  112. ;
  113. ;    // Well, now it will be done.
  114. ;    sec->validcount = validcount;
  115. ;    
  116. ;    lightnum = (sec->lightlevel >> LIGHTSEGSHIFT)+extralight;
  117. ;
  118. ;    if (lightnum < 0)
  119. ;    spritelights = scalelight[0];
  120. ;   else if (lightnum >= LIGHTLEVELS)
  121. ;    spritelights = scalelight[LIGHTLEVELS-1];
  122. ;    else
  123. ;    spritelights = scalelight[lightnum];
  124. ;
  125. ;    // Handle all things in sector.
  126. ;    for (thing = sec->thinglist ; thing ; thing = thing->snext)
  127. ;    R_ProjectSprite (thing);
  128. ;}
  129.  
  130. ;-----------------------------------------------------------------------
  131. ; R_DrawMasked (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
  132.  
  133. ;;;        xref    @R_SortVisSprites
  134.         xref    _vissprite_p    ;vissprite_t*
  135.         xref    _vissprites    ;FAR vissprite_t[MAXVISSPRITES]
  136.         xref    _ds_p        ;drawseg_t*
  137.         xref    _drawsegs    ;FAR drawseg_t drawsegs[MAXDRAWSEGS]
  138.         xref    @R_RenderMaskedSegRange
  139.         xref    _viewangleoffset    ;int
  140.         xref    _vsprsortedhead    ;vissprite_t
  141.         xref    @R_DrawPlayerSprites
  142.         xref    @R_PointOnSegSide
  143.         xref    @R_RenderMaskedSegRange
  144. ;;;        xref    @R_DrawVisSprite
  145.         xref    _mfloorclip
  146.         xref    _mceilingclip
  147.         xref    _viewheight
  148. ;;;        xref    @R_DrawSprite
  149.  
  150.         STRUCTURE    vissprite,0
  151.  
  152.          APTR    vp_prev
  153.          APTR    vp_next
  154.          LONG    vp_x1
  155.          LONG    vp_x2
  156.          LONG    vp_gx
  157.          LONG    vp_gy
  158.          LONG    vp_gz
  159.          LONG    vp_gzt
  160.          LONG    vp_startfrac
  161.          LONG    vp_scale
  162.          LONG    vp_xiscale
  163.          LONG    vp_texturemid
  164.          LONG    vp_patch
  165.          APTR    vp_colormap
  166.          LONG    vp_mobjflags
  167.         LABEL    vp_size
  168.  
  169.         STRUCTURE    drawseg,0
  170.          APTR    ds_curline
  171.          LONG    ds_x1
  172.          LONG    ds_x2
  173.          LONG    ds_scale1
  174.          LONG    ds_scale2
  175.          LONG    ds_scalestep
  176.          LONG    ds_silhouette
  177.          LONG    ds_bsilheight
  178.          LONG    ds_tsilheight
  179.          APTR    ds_sprtopclip
  180.          APTR    ds_sprbottomclip
  181.          APTR    ds_maskedtexturecol
  182.         LABEL    ds_size
  183.  
  184.         cnop    0,4
  185. @R_DrawMasked:
  186. _R_DrawMasked:
  187.         movem.l    a2/a3,-(sp)
  188.         jsr    (@R_SortVisSprites)
  189.  
  190.         move.l    #_vissprites,d1
  191.         move.l    _vissprite_p(a4),d0
  192.         cmp.l    d0,d1
  193.         bge.b    .rdm_Skip1
  194.  
  195.         lea    _vsprsortedhead(a4),a3
  196.         move.l    4(a3),a2
  197. .rdm_Loop1:
  198.         move.l    a2,a0
  199.         jsr    (@R_DrawSprite)
  200.         move.l    vp_next(a2),a2
  201.         cmp.l    a2,a3
  202.         bne.b    .rdm_Loop1
  203.  
  204. .rdm_Skip1:    
  205.         move.l    #_drawsegs,a3
  206.         move.l    _ds_p(a4),a2
  207.         sub.l    #ds_size,a2
  208. .rdm_Loop2:
  209.         tst.l    ds_maskedtexturecol(a2)
  210.         beq.b    .rdml2_Skip
  211.         move.l    a2,a0
  212.         move.l    ds_x1(a2),d0
  213.         move.l    ds_x2(a2),d1
  214.         jsr    (@R_RenderMaskedSegRange)
  215.  
  216. .rdml2_Skip:
  217.         sub.l    #ds_size,a2
  218.         cmp.l    a3,a2
  219.         bge.b    .rdm_Loop2
  220.  
  221.         tst.l    _viewangleoffset(a4)
  222.         bne.b    .rdm_Exit
  223.         jsr    (@R_DrawPlayerSprites)
  224.  
  225. .rdm_Exit:
  226.         movem.l    (sp)+,a2/a3
  227.         rts
  228.  
  229.  
  230. ;void R_DrawMasked (void)
  231. ;{
  232. ;    vissprite_t*    spr;
  233. ;    drawseg_t*        ds;
  234. ;    
  235. ;    R_SortVisSprites ();
  236. ;
  237. ;    if (vissprite_p > vissprites)
  238. ;    {
  239. ;    // draw all vissprites back to front
  240. ;    for (spr = vsprsortedhead.next ;
  241. ;         spr != &vsprsortedhead ;
  242. ;         spr=spr->next)
  243. ;    {
  244. ;        
  245. ;        R_DrawSprite (spr);
  246. ;    }
  247. ;    }
  248. ;   
  249. ;    // render any remaining masked mid textures
  250. ;    for (ds=ds_p-1 ; ds >= drawsegs ; ds--)
  251. ;    if (ds->maskedtexturecol)
  252. ;        R_RenderMaskedSegRange (ds, ds->x1, ds->x2);
  253. ;   
  254. ;    // draw the psprites on top of everything
  255. ;    //  but does not draw on side views
  256. ;    if (!viewangleoffset)        
  257. ;    R_DrawPlayerSprites ();
  258. ;}
  259.  
  260. ;-----------------------------------------------------------------------
  261. ; R_DrawSprite (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
  262.  
  263. ;;;        xref    @R_SortVisSprites
  264.         xref    _vissprite_p    ;vissprite_t*
  265.         xref    _vissprites    ;FAR vissprite_t[MAXVISSPRITES]
  266.         xref    _ds_p        ;drawseg_t*
  267.         xref    _drawsegs    ;FAR drawseg_t drawsegs[MAXDRAWSEGS]
  268.         xref    @R_RenderMaskedSegRange
  269.         xref    _viewangleoffset    ;int
  270.         xref    _vsprsortedhead    ;vissprite_t
  271.         xref    @R_DrawPlayerSprites
  272.         xref    @R_PointOnSegSide
  273.         xref    @R_RenderMaskedSegRange
  274. ;;;        xref    @R_DrawVisSprite
  275.         xref    _mfloorclip
  276.         xref    _mceilingclip
  277.         xref    _viewheight
  278.         xref    @memcpy
  279.  
  280. @R_DrawSprite:
  281. _R_DrawSprite:
  282.  
  283.         movem.l    d2-d7/a2/a3/a5/a6,-(sp)
  284.  
  285.         move.l    a0,a3    ;save the sprite
  286.  
  287.         move.l    vp_x2(a0),d0
  288.         move.l    vp_x1(a0),d1
  289.         sub.l    d1,d0
  290.         blt.b    .rds_Skip1
  291.         add.l    d1,d1
  292. ;;;        move.l    #clipbot,a0
  293.         lea    clipbot(a4),a0
  294.         add.l    d1,a0
  295. ;;;        move.l    #cliptop,a1
  296.         lea    cliptop(a4),a1
  297.         add.l    d1,a1
  298.  
  299.         btst.l    #1,d1
  300.         beq.b    .rds_BoundOK
  301.         move.w    #-2,(a0)+
  302.         move.w    #-2,(a1)+
  303.         subq.l    #1,d0
  304.         bmi.b    .rds_Skip1
  305.         beq.b    .rdsl1_Last
  306. .rds_BoundOK:
  307.         move.b    d0,d1
  308.  
  309. .rds_Loop1:
  310.         move.l    #$FFFEFFFE,(a0)+
  311.         move.l    #$FFFEFFFE,(a1)+
  312.         subq.l    #2,d0
  313.         bgt.b    .rds_Loop1
  314.         btst.l    #0,d1
  315.         bne.b    .rds_Skip1
  316. .rdsl1_Last:
  317.         move.w    #-2,(a0)
  318.         move.w    #-2,(a1)    
  319.  
  320. .rds_Skip1:
  321.         move.l    _ds_p(a4),a2
  322.         sub.l    #ds_size,a2        ;ds (a2) = ds_p-1
  323.         move.l    #_drawsegs,d7
  324.  
  325.         move.l    vp_scale(a3),d2    ;these ones are used in loop below and
  326.         move.l    vp_gz(a3),d3
  327.         move.l    vp_gzt(a3),d4
  328.  
  329. .rds_Loop2:
  330.         move.l    ds_x1(a2),d0
  331.         move.l    ds_x2(a2),d1
  332.         move.l    vp_x1(a3),d5
  333.         move.l    vp_x2(a3),d6
  334.  
  335.         cmp.l    d6,d0
  336.         bgt.b    .rdsl2_Next
  337.         cmp.l    d5,d1
  338.         blt.b    .rdsl2_Next
  339.  
  340.         tst.l    ds_silhouette(a2)
  341.         bne.b    .rdsl2_DoLoop
  342.         tst.l    ds_maskedtexturecol(a2)
  343.         beq.b    .rdsl2_Next
  344.  
  345. .rdsl2_DoLoop:
  346.         cmp.l    d5,d0
  347.         blt.b    .rdsl2_R1OK
  348.         move.l    d0,d5
  349. .rdsl2_R1OK:
  350.         cmp.l    d6,d1
  351.         bgt.b    .rdsl2_R2OK
  352.         move.l    d1,d6
  353. .rdsl2_R2OK:
  354.  
  355. ;At this stage:
  356. ;a2: ds        (always, really)
  357. ;a3: spr    (always, too)
  358. ;d5: r1
  359. ;d6: r2
  360.  
  361.         move.l    ds_scale1(a2),d0    ;scale (?)
  362.         move.l    ds_scale2(a2),d1    ;lowscale  (?)
  363.         cmp.l    d0,d1
  364.         blt.b    .rdsl2_ScalesOK
  365.         move.l    d1,d0
  366.         move.l    ds_scale1(a2),d1
  367. .rdsl2_ScalesOK:
  368.  
  369. ;now:
  370. ;d1:lowscale
  371. ;d0:scale
  372.  
  373.         cmp.l    d2,d0
  374.         blt.b    .rdsl2_DoStuff1    ;scale<spr->scale is TRUE, RenderMaskedSegRange
  375.         cmp.l    d2,d1
  376.         bge.b    .rdsl2_SkipStuff1    ;above is FALSE, lowscale<spr->scale is false... no RMSR
  377.         move.l    vp_gx(a3),d0
  378.         move.l    vp_gy(a3),d1
  379.         move.l    ds_curline(a2),a0
  380.         jsr        (@R_PointOnSegSide)
  381.         tst.l    d0
  382.         bne.b    .rdsl2_SkipStuff1    ;all above is FALSE and PointOnSegSide is TRUE.. so the expression is false => skip
  383. .rdsl2_DoStuff1:
  384.         tst.l    ds_maskedtexturecol(a2)
  385.         beq.b    .rdsl2_Next
  386.         move.l    a2,a0    ;(ds,
  387.         move.l    d5,d0    ;r1,
  388.         move.l    d6,d1    ;r2)
  389.         jsr    (@R_RenderMaskedSegRange)
  390.         bra.b    .rdsl2_Next
  391.  
  392. .rdsl2_SkipStuff1:
  393.         move.l    ds_silhouette(a2),d0
  394.         beq.b    .rdsl2_Next    ;silhouette is zero, no point ANDing and testing..
  395.  
  396.         cmp.l    ds_bsilheight(a2),d3
  397.         blt.b    .rdsl2_SilSkip1
  398.         and.l    #~1,d0    ;silhouette &=~SIL_BOTTOM
  399.         beq.b    .rdsl2_Next    ;went zero, no tests!
  400.  
  401. .rdsl2_SilSkip1:
  402.         cmp.l    ds_tsilheight(a2),d4
  403.         bgt.b    .rdsl2_SilSkip2
  404.         and.l    #~2,d0    ;silhouette &=~SIL_TOP
  405.         beq.b    .rdsl2_Next    ;went zero
  406.  
  407. .rdsl2_SilSkip2:
  408.         cmp.l    #1,d0
  409.         bne.b    .rdsl2_SilNot1
  410.         sub.l    d5,d6    ;x=r1  x<=r2
  411.         blt.b    .rdsl2_Next
  412.         add.l    d5,d5
  413. ;;;        move.l    #clipbot,a0
  414.         lea    clipbot(a4),a0
  415.         add.l    d5,a0
  416.         move.l    ds_sprbottomclip(a2),a1
  417.         add.l    d5,a1
  418. .rdsl2_SilLoop1:
  419.         move.w    (a1)+,d0
  420.         cmp.w    #-2,(a0)+
  421.         bne.b    .rdsl2sl1_Skip
  422.         move.w    d0,-2(a0)
  423. .rdsl2sl1_Skip:
  424.         dbf    d6,.rdsl2_SilLoop1
  425.         bra.b    .rdsl2_Next
  426.  
  427. .rdsl2_SilNot1:
  428.         cmp.l    #2,d0
  429.         bne.b    .rdsl2_SilNot2
  430.         sub.l    d5,d6
  431.         blt.b    .rdsl2_Next
  432.         add.l    d5,d5
  433. ;;;        move.l    #cliptop,a0
  434.         lea    cliptop(a4),a0
  435.         add.l    d5,a0
  436.         move.l    ds_sprtopclip(a2),a1
  437.         add.l    d5,a1
  438. .rdsl2_SilLoop2:
  439.         move.w    (a1)+,d0
  440.         cmp.w    #-2,(a0)+
  441.         bne.b    .rdsl2sl2_Skip
  442.         move.w    d0,-2(a0)
  443. .rdsl2sl2_Skip:
  444.         dbf    d6,.rdsl2_SilLoop2
  445.         bra.b    .rdsl2_Next
  446.  
  447. .rdsl2_SilNot2:
  448.         cmp.l    #3,d0
  449.         bne.b    .rdsl2_Next
  450.         sub.l    d5,d6
  451.         blt.b    .rdsl2_Next
  452.         lsl.l    #1,d5
  453. ;;;        move.l    #cliptop,a0
  454.         lea    cliptop(a4),a0
  455.         add.l    d5,a0
  456. ;;;        move.l    #clipbot,a1
  457.         lea    clipbot(a4),a1
  458.         add.l    d5,a1
  459.         move.l    ds_sprbottomclip(a2),a5
  460.         move.l    ds_sprtopclip(a2),a6
  461.         add.l    d5,a5
  462.         add.l    d5,a6
  463. .rdsl2_SilLoop3:
  464.         move.w    (a5)+,d0
  465.         move.w    (a6)+,d1
  466.         cmp.w    #-2,(a0)+
  467.         bne.b    .rdsl2sl3_Skip1
  468.         move.w    d1,-2(a0)
  469. .rdsl2sl3_Skip1:
  470.         cmp.w    #-2,(a1)+
  471.         bne.b    .rdsl2sl3_Skip2
  472.         move.w    d0,-2(a1)
  473. .rdsl2sl3_Skip2:
  474.         dbf    d6,.rdsl2_SilLoop3
  475.  
  476. .rdsl2_Next:
  477.         sub.l    #ds_size,a2
  478.         cmp.l    d7,a2
  479.         bge.b    .rds_Loop2
  480.  
  481.         move.l    vp_x2(a3),d0    ;spr->x2
  482.         sub.l    vp_x1(a3),d0    ;x<=spr->x2
  483.         blt.b    .rds_SkipL3
  484.         move.l    vp_x1(a3),d7    ;x
  485.         add.l    d7,d7
  486.         move.l    _viewheight(a4),d1
  487. ;;;        move.l    #clipbot,a0
  488.         lea    clipbot(a4),a0
  489.         add.l    d7,a0
  490. ;;;        move.l    #cliptop,a1
  491.         lea    cliptop(a4),a1
  492.         add.l    d7,a1
  493. .rds_Loop3:
  494.         cmp.w    #-2,(a0)+
  495.         bne.b    .rdsl3_Skip1
  496.         move.w    d1,-2(a0)
  497. .rdsl3_Skip1:
  498.         cmp.w    #-2,(a1)+
  499.         bne.b    .rdsl3_Skip2
  500.         move.w    #-1,-2(a1)
  501. .rdsl3_Skip2:
  502.         dbf    d0,.rds_Loop3
  503.  
  504. .rds_SkipL3:
  505. ;;;        move.l    #clipbot,_mfloorclip(a4)
  506.         lea    clipbot(a4),a0
  507.         move.l    a0,_mfloorclip(a4)
  508. ;;;        move.l    #cliptop,_mceilingclip(a4)
  509.         lea    cliptop(a4),a0
  510.         move.l    a0,_mceilingclip(a4)
  511.         move.l    a3,a0
  512.         movem.l    (sp)+,d2-d7/a2/a3/a5/a6
  513.         jmp    (@R_DrawVisSprite)
  514.  
  515.  
  516. ;void R_DrawSprite (vissprite_t* spr)
  517. ;{
  518. ;    drawseg_t*        ds;
  519. ;    static short    clipbot[MAXSCREENWIDTH];
  520. ;    static short    cliptop[MAXSCREENWIDTH];
  521. ;    int            x;
  522. ;    int            r1;
  523. ;    int            r2;
  524. ;    fixed_t        scale;
  525. ;    fixed_t        lowscale;
  526. ;    int            silhouette;
  527. ;
  528. ;    for (x = spr->x1 ; x<=spr->x2 ; x++)
  529. ;    clipbot[x] = cliptop[x] = -2;
  530. ;
  531. ;    // Scan drawsegs from end to start for obscuring segs.
  532. ;    // The first drawseg that has a greater scale
  533. ;    //  is the clip seg.
  534. ;    for (ds=ds_p-1 ; ds >= drawsegs ; ds--)
  535. ;    {
  536. ;    // determine if the drawseg obscures the sprite
  537. ;    if (ds->x1 > spr->x2
  538. ;        || ds->x2 < spr->x1
  539. ;        || (!ds->silhouette
  540. ;        && !ds->maskedtexturecol) )
  541. ;    {
  542. ;        // does not cover sprite
  543. ;        continue;
  544. ;    }
  545. ;            
  546. ;    r1 = ds->x1 < spr->x1 ? spr->x1 : ds->x1;
  547. ;    r2 = ds->x2 > spr->x2 ? spr->x2 : ds->x2;
  548. ;
  549. ;    if (ds->scale1 > ds->scale2)
  550. ;    {
  551. ;        lowscale = ds->scale2;
  552. ;        scale = ds->scale1;
  553. ;    }
  554. ;    else
  555. ;    {
  556. ;        lowscale = ds->scale1;
  557. ;        scale = ds->scale2;
  558. ;    }
  559. ;        
  560. ;    if (scale < spr->scale
  561. ;        || ( lowscale < spr->scale
  562. ;         && !R_PointOnSegSide (spr->gx, spr->gy, ds->curline) ) )
  563. ;    {
  564. ;        // masked mid texture?
  565. ;        if (ds->maskedtexturecol)    
  566. ;        R_RenderMaskedSegRange (ds, r1, r2);
  567. ;        // seg is behind sprite
  568. ;        continue;            
  569. ;    }
  570. ;
  571. ;    
  572. ;    // clip this piece of the sprite
  573. ;    silhouette = ds->silhouette;
  574. ;    
  575. ;    if (spr->gz >= ds->bsilheight)
  576. ;        silhouette &= ~SIL_BOTTOM;
  577. ;
  578. ;    if (spr->gzt <= ds->tsilheight)
  579. ;        silhouette &= ~SIL_TOP;
  580. ;            
  581. ;    if (silhouette == 1)
  582. ;    {
  583. ;        // bottom sil
  584. ;        for (x=r1 ; x<=r2 ; x++)
  585. ;        if (clipbot[x] == -2)
  586. ;            clipbot[x] = ds->sprbottomclip[x];
  587. ;    }
  588. ;    else if (silhouette == 2)
  589. ;    {
  590. ;        // top sil
  591. ;        for (x=r1 ; x<=r2 ; x++)
  592. ;        if (cliptop[x] == -2)
  593. ;            cliptop[x] = ds->sprtopclip[x];
  594. ;    }
  595. ;    else if (silhouette == 3)
  596. ;    {
  597. ;        // both
  598. ;        for (x=r1 ; x<=r2 ; x++)
  599. ;        {
  600. ;        if (clipbot[x] == -2)
  601. ;            clipbot[x] = ds->sprbottomclip[x];
  602. ;        if (cliptop[x] == -2)
  603. ;            cliptop[x] = ds->sprtopclip[x];
  604. ;        }
  605. ;    }
  606. ;        
  607. ;    }
  608. ;  
  609. ;    // all clipping has been performed, so draw the sprite
  610. ;
  611. ;    // check for unclipped columns
  612. ;    for (x = spr->x1 ; x<=spr->x2 ; x++)
  613. ;    {
  614. ;    if (clipbot[x] == -2)        
  615. ;        clipbot[x] = viewheight;
  616. ;
  617. ;    if (cliptop[x] == -2)
  618. ;        cliptop[x] = -1;
  619. ;    }
  620. ;        
  621. ;    mfloorclip = clipbot;
  622. ;    mceilingclip = cliptop;
  623. ;    R_DrawVisSprite (spr, spr->x1, spr->x2);
  624. ;
  625. ;}
  626.  
  627. ;-----------------------------------------------------------------------
  628. ; R_DrawVisSprite (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
  629.  
  630.         xref    @W_CacheLumpNum
  631.         xref    _firstspritelump
  632.         xref    _dc_colormap
  633.         xref    _colfunc
  634.         xref    _fuzzcolfunc
  635.         xref    _transcolfunc
  636.         xref    _dc_translation        ;byte*
  637.         xref    _translationtables    ;byte*
  638.         xref    _dc_iscale
  639.         xref    _dc_texturemid
  640.         xref    _spryscale
  641.         xref    _sprtopscreen
  642.         xref    _centeryfrac
  643.         xref    _FixedMul
  644.         xref    _dc_x
  645.         xref    @R_DrawMaskedColumn
  646.         xref    _basecolfunc
  647.         xref    _detailshift
  648.  
  649. ;humm... the prototype (and all calls) should be changed to:
  650. ; void R_DrawVisSprite(vissprite_t* vis);
  651. ; because int x1 and int x2 are UNUSED! They are always just
  652. ; copies of the sprite->x1 sprite->x2
  653.  
  654.         cnop    0,4
  655. @R_DrawVisSprite:
  656. _R_DrawVisSprite:
  657.  
  658.         movem.l    d2/d7/a2/a3,-(sp)
  659.  
  660.         move.l    a0,a2    ;save vis
  661.         move.l    vp_patch(a0),d0
  662.         add.l    _firstspritelump(a4),d0
  663.         moveq    #101,d1    ;PU_CACHE
  664.         jsr    (@W_CacheLumpNum)
  665.         move.l    d0,a3    ;store patch
  666.  
  667.         move.l    vp_colormap(a2),_dc_colormap(a4)
  668.         beq.b    .rdvs_FuzzCol    ;if (!dc_colormap)
  669.         move.l    vp_mobjflags(a2),d0    ;used below, too
  670.         and.l    #$c000000,d0    ;& MF_TRANSLATION
  671.         beq.b    .rdvs_ColFuncOK    ;not true... just go on
  672.  
  673.         move.l    _transcolfunc(a4),_colfunc(a4)
  674.         swap    d0    ;this way better scheduled for 040
  675.         move.l    _translationtables(a4),_dc_translation(a4)
  676.         and.l    #$FFFF,d0
  677.         sub.l    #256,d0
  678.         add.l    d0,_dc_translation(a4)
  679.         bra.b    .rdvs_ColFuncOK
  680.  
  681. .rdvs_FuzzCol:
  682.         move.l    _fuzzcolfunc(a4),_colfunc(a4)
  683. .rdvs_ColFuncOK:
  684.         move.l    vp_xiscale(a2),d0
  685.         beq.b    .rdvs_SetScale    ;if NULL do not do shifts etc.
  686.         bpl.b    .rdvs_absskip    ;this is iabs
  687.         neg.l    d0
  688. .rdvs_absskip:
  689.         move.l    _detailshift(a4),d1
  690.         lsr.l    d1,d0
  691. .rdvs_SetScale:
  692.         move.l    d0,_dc_iscale(a4)
  693.  
  694.         move.l    vp_texturemid(a2),d0    ;used below..
  695.         move.l    d0,_dc_texturemid(a4)
  696.         move.l    vp_scale(a2),d1        ;used below
  697.         move.l    d1,_spryscale(a4)
  698.         move.l    _FixedMul(a4),a0
  699.         jsr    (a0)
  700.         move.l    _centeryfrac(a4),_sprtopscreen(a4)
  701.         sub.l    d0,_sprtopscreen(a4)
  702.  
  703.         move.l    vp_startfrac(a2),d2    ;d2: frac
  704.  
  705.         move.l    vp_x1(a2),_dc_x(a4)    ;dc_x=vis->x1
  706.         move.l    vp_x2(a2),d7
  707.         sub.l    vp_x1(a2),d7    ;for(..; dc_x<=vis->x2;..)
  708.         blt.b    .rdvs_NoDraw
  709. .rdvs_Loop:
  710.         move.l    d2,d0    ;texturecolumn=frac..
  711.         swap    d0    ;.. >>FRACBITS    (and then we need only WORD below)
  712.         move.l    a3,a0    ;column=patch+
  713.         move.l    (8,a3,d0.w*4),d0    ;patch->columnofs[texturecolumn]
  714.         rol.w    #8,d0
  715.         swap    d0
  716.         rol.w    #8,d0    ;SWAPLONG
  717.         add.l    d0,a0
  718.         jsr    (@R_DrawMaskedColumn)
  719.         addq.l    #1,_dc_x(a4)    ;dc_x++
  720.         add.l    vp_xiscale(a2),d2    ;frac += vis->xiscale
  721.         dbf    d7,.rdvs_Loop
  722. .rdvs_NoDraw:
  723.         move.l    _basecolfunc(a4),_colfunc(a4)
  724.  
  725.         movem.l    (sp)+,d2/d7/a2/a3
  726.  
  727.         rts
  728.  
  729. ;void
  730. ;R_DrawVisSprite
  731. ;( vissprite_t*        vis,
  732. ;  int            x1,
  733. ;  int            x2 )
  734. ;{
  735. ;    column_t*        column;
  736. ;    int            texturecolumn;
  737. ;    fixed_t        frac;
  738. ;    patch_t*        patch;
  739. ;    
  740. ;    
  741. ;    patch = W_CacheLumpNum (vis->patch+firstspritelump, PU_CACHE);
  742. ;
  743. ;    dc_colormap = vis->colormap;
  744. ;    
  745. ;    if (!dc_colormap)
  746. ;    {
  747. ;    colfunc = fuzzcolfunc;
  748. ;    }
  749. ;    else if (vis->mobjflags & MF_TRANSLATION)
  750. ;    {
  751. ;    colfunc = transcolfunc;
  752. ;    dc_translation = translationtables - 256 +
  753. ;        ( (vis->mobjflags & MF_TRANSLATION) >> (MF_TRANSSHIFT-8) );
  754. ;    }
  755. ;    
  756. ;    dc_iscale = iabs(vis->xiscale)>>detailshift;
  757. ;    dc_texturemid = vis->texturemid;
  758. ;    frac = vis->startfrac;
  759. ;    spryscale = vis->scale;
  760. ;    sprtopscreen = centeryfrac - FixedMul(dc_texturemid,spryscale);
  761. ;    
  762. ;    for (dc_x=vis->x1 ; dc_x<=vis->x2 ; dc_x++, frac += vis->xiscale)
  763. ;    {
  764. ;    texturecolumn = frac>>FRACBITS;
  765. ;    column = (column_t *) ((byte *)patch +
  766. ;                   SWAPLONG(patch->columnofs[texturecolumn]));
  767. ;
  768. ;    R_DrawMaskedColumn (column);
  769. ;    }
  770. ;
  771. ;    colfunc = basecolfunc;
  772. ;}
  773.  
  774. ;-----------------------------------------------------------------------
  775. ; R_SortVisSprites (in r_things.c) by Arto Huusko <arto.huusko@pp.qnet.fi>
  776.  
  777.         xref    _vissprite_p    ;vissprite_t*
  778.         xref    _vissprites    ;FAR vissprite_t vissprites[MAXVISSPRITES]
  779.         xref    _vsprsortedhead    ;vissprite_t
  780.  
  781. MAXINT        equ    $7FFFFFFF
  782. MAXSPRITE    equ    128
  783.  
  784.         cnop    0,4
  785. @R_SortVisSprites:
  786. _R_SortVisSprites:
  787.         movem.l    a2/a3/a5,-(sp)
  788.  
  789.         move.l    _vissprite_p(a4),d0
  790.         beq.b    .rsv_Exit    ;no sprites to sort
  791.  
  792.         move.l    d0,a1
  793.         lea    _vsprsortedhead(a4),a0    ;kept here
  794.         move.l    a0,-vp_size+vp_next(a1)    ;this connection is not yet made!
  795.  
  796.         move.l    vp_next(a0),a1
  797.         move.l    vp_scale(a1),d0
  798.         bra.b    .rsv_Loop
  799.         cnop    0,4
  800. .rsv_Next:
  801.         move.l    a2,a1
  802.         move.l    d1,d0
  803. .rsv_Loop:
  804.         move.l    vp_next(a1),a2
  805.         move.l    vp_scale(a2),d1
  806.         beq.b    .rsv_Exit    ;vsprsortedhead has null scale
  807.         cmp.l    d1,d0
  808.         ble.b    .rsv_Next
  809.         move.l    a0,a3
  810. .rsv_GoDown:
  811.         move.l    vp_next(a3),a3
  812.         cmp.l    vp_scale(a3),d1
  813.         bge.b    .rsv_GoDown
  814.         move.l    vp_next(a2),a5
  815.         move.l    a5,vp_next(a1)
  816.         move.l    a1,vp_prev(a5)
  817.         move.l    vp_prev(a3),a5
  818.         move.l    a2,vp_next(a5)
  819.         move.l    a2,vp_prev(a3)
  820.         move.l    a5,vp_prev(a2)
  821.         move.l    a3,vp_next(a2)
  822.         bra.b    .rsv_Loop
  823.  
  824. .rsv_Exit:
  825.         movem.l    (sp)+,a2/a3/a5
  826.         rts
  827.  
  828.         cnop    0,4
  829. @R_NewVisSprite:
  830. _R_NewVisSprite:
  831.         move.l    _vissprite_p(a4),d0
  832.         beq.b    .rn_FirstTime
  833.         cmp.l    #_vissprites+vp_size*MAXSPRITE,d0
  834.         beq.b    .rn_OverFlow
  835.         add.l    #vp_size,_vissprite_p(a4)
  836.  
  837. ;Establish proper connections between nodes. The new sprite does
  838. ;not get pointer to next sprite because that is set next time we
  839. ;get here. The pointer for last sprite is set in SortVisSprites
  840.         move.l    d0,a0
  841.         move.l    a0,_vsprsortedhead(a4)
  842.         sub.l    #vp_size,a0
  843.         move.l    d0,vp_next(a0)
  844.         move.l    a0,vp_size+vp_prev(a0)
  845.         rts
  846.  
  847. .rn_OverFlow:
  848. ;;;        move.l    #overflow,d0
  849.         lea    overflow(a4),a0
  850.         move.l    a0,d0
  851.         rts
  852. .rn_FirstTime:
  853.         move.l    #_vissprites+vp_size,_vissprite_p(a4)
  854.         move.l    #_vissprites,d0
  855.         rts
  856.  
  857.         cnop    0,4
  858. @R_ClearSprites:
  859. _R_ClearSprites:
  860.         move.l    #_vissprites,a0
  861.         move.l    #0,_vissprite_p(a4)
  862.         lea    _vsprsortedhead(a4),a1
  863.         move.l    a0,vp_next(a1)
  864.         move.l    a0,vp_prev(a1)
  865.         move.l    a1,vp_prev(a0)
  866.         rts
  867.  
  868.  
  869. ;-----------------------------------------------------------------------
  870.         section    __MERGED,bss
  871.  
  872.             cnop    0,4
  873. MAXSCREENWIDTH    equ    1600
  874. clipbot:    ds.w    MAXSCREENWIDTH
  875. cliptop:    ds.w    MAXSCREENWIDTH
  876.  
  877. overflow:    ds.b    vp_size
  878.  
  879. ;-----------------------------------------------------------------------
  880.  
  881.         end
  882.